<?php
/**
 *  Базовый класс для классов системы
 *
 * Обеспечивает фукционал улучшающий удобство работы с системой
 *
 *
 * @author 
 * @version 1.0.2b
 */
abstract class Base {
  /**
   * универсальный геттер позволяющий обернуть все прямые обращения
   * к переменным в их персональный геттер
   *
   * @param string $var
   * @return mixed
   */
  public function __get($var) {
    // krumo workaround
    if (strpos($var, 'krumo') !== false) { return 0; }
    //
    if (method_exists($this, $method = 'get_'.$var) ) {
     return $this->$method();         
    } elseif(property_exists($this, $property = '_'.$var)){
      return $this->$property;
    }elseif( array_key_exists($var ,$this->___systems)){
		return $this->$var;
    } else {
     throw new Exception("Property ".$var." does not avaible for get in class ".get_class($this));
    }
  }
     
  /**
   * универсальный сеттер позволяющий обернуть все прямые обращения
   * к переменным в их персональный сеттер
   *
   * @param string $var
   * @param mixed $var
   * @return void
   */
  public function __set($var, $value) {
    // krumo workaround
    if (strpos($var, 'krumo') !== false) {
      return;
      // $this->$var = $value;
    }
    //
    if (method_exists($this, $method = 'set_'.$var) ) {
      $this->__change($var, $value);
      return $this->$method($value);
    } elseif(property_exists($this, $property = '_'.$var)) {
      $this->__change($var, $value);
      $this->$property = $value;
    } else {
      throw new Exception("Property ".$var." does not avaible for set in class ".get_class($this));
    }
  }
    
 
      
   //функция для переопределения, вызывается ниже если нужно провести какие-то действия при изменении поля
   protected function __change($var, $value) {/* ^_^ */ }
      
  /**
   * @desc Делегат для get_object_vars
   */
      
  public function get_object_vars() {
    return get_object_vars($this);
  }
      
  public function get_class_name() {
    return get_class($this);
  }

  public function dump()
  {
    var_dump($this);
  }     
}
?>
